package com.lg.startertemplate.domain.cascade.one2many;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.lg.startertemplate.domain.cascade.one2many.Dog;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;

/**
 * 一对多
 * 一个人 可以 有多只狗
 * 多只狗 可以 被一个人拥有
 *
 */
@Entity
@Data
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
public class Man  implements Serializable{

    private static final long serialVersionUID = -770418481892693907L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
//    private Long id;
    private Long manId;

    private String name;
    private Integer age;


    //一对多 外键在多的那边生成 如果关联关系存到 一的这边 , 那它怎么存储那个list外键.
    //一对多 name是多的那边的属性 referencedColumnName 指的是 一 这边的主机!!!
    //一对多 外键在多的那边维护  name  referencedColumnName 有所不同
    //这两个 主键和外键 的值是相同的, 怎么能是两个id呢???

    /**
     * 主里面有孩子  孩子里面有主  解决循环查找
     *
     * 在两边都 加 @JsonIgnore 这并不是最优的解决方法 但其他的都没试成功
     * todo
     */



//    @JsonIgnore           //虽然不报异常,但debugger 的时候 仍然会有很多的查询
    @JsonIgnoreProperties(value = "man")    //这边不会生效  那边可以生效
    @OneToMany(cascade = CascadeType.ALL,fetch=FetchType.LAZY)       //cascade = CascadeType.ALL 必须是指定  默认是不起作用的
//    不写会 自动生成中间表  推荐使用不写
    @JoinColumn(name = "manId", referencedColumnName = "manId")
//    中间表的 名称  两个关联键
//    @JoinTable(name="manDog",joinColumns = {@JoinColumn(name="manId")},inverseJoinColumns = {@JoinColumn(name = "dogId")})
    private Set<Dog> dogs;

}
